package com.easy.tool.manual;

import com.easy.tool.utils.array.ArrayUtils;
import org.apache.log4j.Logger;

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author 高俊
 * @create 2022-04-2022/4/8-16:09
 */
public class FileTreeAndCount {
    private Logger logger = Logger.getLogger(FileTreeAndCount.class);
    private String filePathFlag = "classes";
    private String fileSuffix = ".class";



    /**
     * 获取文件树
     * @param filePath      本地目录路径
     * @throws IOException
     */
    protected Map<String,List<String>> ManualFileTree(String filePath) {

        AtomicInteger dirCount = new AtomicInteger();
        AtomicInteger fileCount = new AtomicInteger();


        // 用于存储目录和文件的对应关系
        Map<String,List<String>> map = new HashMap<>();
        // 储存当前文件名称
        final String[] curDir = {""};

        try {
            Files.walkFileTree(Paths.get(filePath),new SimpleFileVisitor<Path>(){

                // 进入文件夹触发方法
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {

                    String path = dir.toString();
                    path = path.substring(path.lastIndexOf("\\")+1);
                    // 进入文件夹保存当前目录
                    curDir[0] = path;

//                    System.out.println("=============> Direction：" + dir);
                    dirCount.incrementAndGet();
                    return super.preVisitDirectory(dir, attrs);
                }



                // 进入文件触发方法
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    String path = file.toString();
                    // 替换 \为 .
                    path = path.replaceAll("\\\\",".");

                    // 截取到 .class文件 的全限定类名
                    String filePackage = path.substring(path.indexOf(filePathFlag) + filePathFlag.length() + 1);
                    filePackage = filePackage.replace(fileSuffix,"");

//                    System.out.println(path);

                    // 获取当前目录的value
                    List<String> list = map.get(curDir[0]);
                    // 判断list是否为空
                    list = ArrayUtils.CollectionEmpty(list);
                    list.add(filePackage);
                    // 当前目录为key。list为value
                    map.put(curDir[0],list);

                    fileCount.incrementAndGet();
                    return super.visitFile(file, attrs);
                }
            });
//            logger.debug("目录总数：" + dirCount);
//            logger.debug("文件总数：" + fileCount);


//            logger.debug(map);
        }catch (Exception e){
            logger.error(e.getMessage());
            e.printStackTrace();
        }
        return map;
    }





    /**
     * 获取文件树
     * @param filePath      本地目录路径
     * @throws IOException
     */
    public void FileTree(String filePath) {

        AtomicInteger dirCount = new AtomicInteger();
        AtomicInteger fileCount = new AtomicInteger();
        try {
            Files.walkFileTree(Paths.get(filePath),new SimpleFileVisitor<Path>(){

                // 进入文件夹触发方法
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {

                    logger.debug("========> Direction：" + dir);
                    dirCount.incrementAndGet();
                    return super.preVisitDirectory(dir, attrs);
                }



                // 进入文件触发方法
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {

                    logger.debug(file);
                    fileCount.incrementAndGet();
                    return super.visitFile(file, attrs);
                }
            });
            logger.debug("目录总数：" + dirCount);
            logger.debug("文件总数：" + fileCount);


//            logger.debug(map);
        }catch (Exception e){
            logger.error(e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 统计 文件、目录
     * @param filePath  文件路径    例如  E:\code
     * @param fileType  文件类型    例如  .java
     */
    public void FileAndDirCount(String filePath,String fileType){
        AtomicInteger jarCount = new AtomicInteger();
        try {
            Files.walkFileTree(Paths.get(filePath),new SimpleFileVisitor<Path>(){
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    // 获取以jar结尾的
                    if (file.toString().endsWith(fileType)) {
                        jarCount.incrementAndGet();
//                        logger.debug(file);
                    }
                    return super.visitFile(file, attrs);
                }
            });
//            logger.debug("jarCount：" + jarCount);
        }catch (Exception e){
            logger.error(e.getMessage());
            e.printStackTrace();
        }

    }
}
